package com.swan.core.utils.json;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.util.List;
import java.util.Objects;

/** FastJson 工具类
 * @author zongf
 * @date 2024-09-27
 **/
@Slf4j
public class JsonObjectUtil {

    /** 获取 String 类型字段
     * @param json json格式字符串，不能是 jsonArray 格式字符串
     * @param keyExpress 级联表达式, 如 name, obj.name, obj[0].name
     * @return String 或 null
     */
    public static String getString(JSONObject json, String keyExpress) {
        Object value = getObject(json, keyExpress);
        return Objects.isNull(value) ? null : value.toString();
    }

    /** 获取 Integer 类型字段
     * @param json json格式字符串，不能是 jsonArray 格式字符串
     * @param keyExpress 级联表达式, 如 name, obj.name, obj[0].name
     * @return Integer 或 null
     */
    public static Integer getInteger(JSONObject json, String keyExpress) {
        String value = getString(json, keyExpress);
        return Objects.isNull(value) ? null : Integer.valueOf(value);
    }

    /** 获取 Long 类型字段
     * @param json json格式字符串，不能是 jsonArray 格式字符串
     * @param keyExpress 级联表达式, 如 name, obj.name, obj[0].name
     * @return Integer 或 null
     */
    public static Long getLong(JSONObject json, String keyExpress)  {
        String value = getString(json, keyExpress);
        return Objects.isNull(value) ? null : Long.valueOf(value);
    }

    /** 获取 Boolean 类型字段
     * @param json json格式字符串，不能是 jsonArray 格式字符串
     * @param keyExpress 级联表达式, 如 name, obj.name, obj[0].name
     * @return Integer 或 null
     */
    public static Boolean getBoolean(JSONObject json, String keyExpress) {
        String value = getString(json, keyExpress);
        return Objects.isNull(value) ? null : Boolean.valueOf(value);
    }

    /** 获取自定义类型字段
     * @param json json格式字符串，不能是 jsonArray 格式字符串
     * @param keyExpress 级联表达式, 如 name, obj.name, obj[0].name
     * @return Integer 或 null
     */
    public static <T> T getObject(JSONObject json, String keyExpress, Class<T> clazz) {
        return JSONObject.parseObject(getString(json, keyExpress), clazz);
    }

    /** 获取 List<T> 类型字段
     * @param json json格式字符串，不能是 jsonArray 格式字符串
     * @param keyExpress 级联表达式, 如 name, obj.name, obj[0].name
     * @return List<T> 或 null
     */
    public static <T> List<T> getList(JSONObject json, String keyExpress, Class<T> clazz) {
        return JSONObject.parseArray(getString(json, keyExpress), clazz);
    }

    /** 获取字符串列表类型字段
     * @param json json格式字符串，不能是 jsonArray 格式字符串
     * @param keyExpress 级联表达式, 如 name, obj.name, obj[0].name
     * @return Integer 或 null
     */
    public static List<String> getStringList(JSONObject json, String keyExpress) {
        return JSONObject.parseArray(getString(json, keyExpress), String.class);
    }

    /** 获取 int 列表字段
     * @param json json格式字符串，不能是 jsonArray 格式字符串
     * @param keyExpress 级联表达式, 如 name, obj.name, obj[0].name
     * @return Integer 或 null
     */
    public static List<Integer> getIntegerList(JSONObject json, String keyExpress){
        return JSONObject.parseArray(getString(json, keyExpress), Integer.class);
    }

    /** 获取 Long 列表字段
     * @param json json格式字符串，不能是 jsonArray 格式字符串
     * @param keyExpress 级联表达式, 如 name, obj.name, obj[0].name
     * @return Integer 或 null
     */
    public static List<Long> getLongList(JSONObject json, String keyExpress){
        return JSONObject.parseArray(getString(json, keyExpress), Long.class);
    }

    /** 获取 Integer 类型字段
     * @param jsonObj json格式字符串，不能是 jsonArray 格式字符串
     * @param keyExpress 级联表达式, 如 name, obj.name, obj[0].name
     * @return Integer 或 null
     */
    public static Object getObject(JSONObject jsonObj, String keyExpress) {
        if (Objects.isNull(jsonObj) || StringUtils.isBlank(keyExpress)) {
            return null;
        }

        String[] fields = keyExpress.split("\\.");

        JSONObject targetObj = jsonObj;

        Object value = null;

        for (int i = 0; i < fields.length; i++) {
            String field = fields[i];

            if(field.contains("[")){
                Integer index = Integer.valueOf(StringUtils.substringBetween(field,"[", "]").trim());
                String fieldArray = StringUtils.substringBefore(field, "[");

                JSONArray jsonArray = targetObj.getJSONArray(fieldArray);
                if (Objects.nonNull(jsonArray)) {
                    if(i == fields.length-1) {
                        value = jsonArray.get(index);
                        break;
                    }else {
                        targetObj = jsonArray.getJSONObject(index);
                    }
                }
            } else {
                if(i == fields.length-1) {
                    if (targetObj != null) {
                        value = targetObj.get(field);
                    }
                    break;
                }else {
                    targetObj = targetObj.getJSONObject(field);
                }
            }
        }

        return Objects.isNull(value) ? null : value.toString();
    }


}
